/**
 * @file map.h
 * @author BadFatCat0919 (543015378@qq.com)
 * @brief 地图类
 */

#ifndef __MAP_H__
#define __MAP_H__

#include "def.h"
#include "Dispatcher.h"
#include "Direction.h"
#include "Bench.h"

/**
 * @brief 地图结点
 */
class MapNode {
public:
    int x, y; // 栅格坐标

public:
    void moveStep(int dir);
    MapNode(int x, int y, int dir);
};

/**
 * @brief 地图
 */
class Map {
public:
    struct benchLocate { // 工作台位置结构体
        int x = -1, y = -1;
        int type = 0;
    };
    struct robotLocate { // 机器人位置结构体
        int x = -1, y = -1;
        bool isEmpty = false;
        int dir = Direction::INVALID;
    };

private:
    static benchLocate benchs[BENCH_NUM_MAX]; // 工作台位置
    static robotLocate robots[ROBOT_NUM_MAX]; // 机器人位置
    static char map[MAP_X_MAX][MAP_Y_MAX]; // 地图符号矩阵
    static char mapFull[MAP_X_MAX_EXPAND][MAP_Y_MAX_EXPAND]; // 空载下的地图符号矩阵
    static char mapEmpty[MAP_X_MAX_EXPAND][MAP_Y_MAX_EXPAND]; // 满载下的地图符号矩阵
    static char mapObstacleFull[MAP_X_MAX_EXPAND][MAP_Y_MAX_EXPAND]; // 空载下的地图周边障碍物数量矩阵
    static char mapObstacleEmpty[MAP_X_MAX_EXPAND][MAP_Y_MAX_EXPAND]; // 满载下的地图周边障碍物数量矩阵
    static int id; // 地图ID

public:
    static bool isInMap(int x, int y);
    static void setPoint(int x, int y, char tag);
    static void expandObstacle();
    static void printToLog();
    static void init();
    static void setID(int id);
    static int getID();
    static bool isObstacle(int x, int y, bool isEmpty);
    static int isRobot(int x, int y, int exceptID = -1, bool isEmpty = false, int dir = Direction::INVALID);
    static int isBench(int x, int y);
    static void refreshBenchLocation(Bench benchs[]);
    static void refreshRobotLocation(Dispatcher dispatchers[]);
    static benchLocate *getBenchLocate(int id);
    static robotLocate *getRobotLocate(int id);
};

#endif // __MAP_H__
